package models

import (
	"time"

	"golang.org/x/crypto/bcrypt"
	"gorm.io/gorm"
)

// User 用户模型 - 对应Typecho的users表
type User struct {
	ID        uint      `gorm:"primaryKey;column:uid" json:"id"`
	Name      string    `gorm:"size:32;uniqueIndex;not null" json:"name"`      // 用户名
	Password  string    `gorm:"size:64;not null" json:"-"`                    // 密码
	Mail      string    `gorm:"size:150;uniqueIndex;not null" json:"mail"`    // 邮箱
	URL       string    `gorm:"size:150" json:"url"`                          // 网站
	ScreenName string   `gorm:"column:screenName;size:32" json:"screen_name"` // 显示名称
	Created   int64     `gorm:"not null;default:0" json:"created"`            // 创建时间戳
	Activated int64     `gorm:"not null;default:0" json:"activated"`          // 最后活跃时间戳
	Logged    int64     `gorm:"not null;default:0" json:"logged"`             // 最后登录时间戳
	Group     string    `gorm:"size:16;default:'visitor'" json:"group"`       // 用户组
	AuthCode  string    `gorm:"column:authCode;size:64" json:"auth_code"`     // 授权码
	
	// GORM关联
	Posts     []Post    `gorm:"-" json:"posts"`
	Pages     []Page    `gorm:"-" json:"pages"`
	Comments  []Comment `gorm:"-" json:"comments"`
	Metas     []Meta    `gorm:"-" json:"metas"`
	
	// 辅助字段
	CreatedAt time.Time `gorm:"-" json:"created_at"`
	UpdatedAt time.Time `gorm:"-" json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
}

// BeforeCreate 创建前钩子
func (u *User) BeforeCreate(tx *gorm.DB) error {
	// 设置创建时间
	if u.Created == 0 {
		u.Created = time.Now().Unix()
	}
	
	// 密码加密
	if u.Password != "" {
		hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
		if err != nil {
			return err
		}
		u.Password = string(hashedPassword)
	}
	
	return nil
}

// AfterFind 查询后钩子
func (u *User) AfterFind(tx *gorm.DB) error {
	// 将Unix时间戳转换为time.Time
	u.CreatedAt = time.Unix(u.Created, 0)
	return nil
}

// CheckPassword 检查密码是否正确
func (u *User) CheckPassword(password string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
	return err == nil
}